package Bruce.GuavaDemo.company;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestReflect {
	// main主程序入口
	public static void main(String[] args) throws ClassNotFoundException {
		TestReflect.getProperty();
		TestReflect.getProperty2();
	}

	// 静态方法，可以用类名.静态方法直接调用
	public static void getProperty() throws ClassNotFoundException {
		// 获取对象类型 包名.类名 ?代表任意类型对象
		Class<?> classType = Class.forName("Bruce.GuavaDemo.company.Customer");
		// 获取对象中的所有方法
		Method[] methods = classType.getDeclaredMethods();
		for (int i = 0; i < methods.length; i++) {
			// 获取方法名字
			String methodName = methods[i].getName();
			// System.out.println(methodName);
			// 获取本方法所有参数类型，存入数组
			Class<?>[] parameterTypes = methods[i].getParameterTypes();
			for (int j = 0; j < parameterTypes.length; j++) {
				String parameterName = parameterTypes[j].getName();
				System.out.println("方法" + methodName + "的参数类型是" + parameterName);
			}
		}
	}

	// 静态方法，可以用类名.静态方法直接调用
	public static void getProperty2() throws ClassNotFoundException {
		// 获取对象类型 包名.类名 ?代表任意类型对象
		Class<?> classType = Class.forName("Bruce.GuavaDemo.company.Customer");
		try {
			Object newClass = classType.newInstance();
			Method method1 = newClass.getClass().getMethod("setName", Class.forName("java.lang.String"));
			method1.invoke(newClass, "123");
			Method method2 = newClass.getClass().getMethod("getName");
			Object redata =method2.invoke(newClass);
			System.out.println(newClass);
			System.out.println(redata);
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
	
	}
}

// 说明：因为getId()和getName()没有参数，所以结果只输出setName()和setId()的参数类型
